home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / text / hyper / guide2html.lha / AG2HTML.pl next >
Perl Script  |  1993-11-03  |  8KB  |  212 lines

  1. #!/usr/local/bin/perl
  2. # <b>This code is (c) 1993 to Michael Witbrock</b>
  3. # <b>You may use it and modify and redistribute it freely,</b>
  4. # <b>but you may not sell it in any way (including in disk collections)</b>
  5. # <b>without first recieving my permission.</b>
  6. # <b>If you significantly improve it, please let me know so that I can</b>
  7. # <b>use the new version.</b>
  8. # <b>You may contact me as witbrock@cs.cmu.edu</b>
  9.  
  10. # P.S. I know that this is redundant. It's my second perl script, and I don't
  11. #     yet know how to do subroutines. When I do, it will be both neater and shorter.
  12. # P.P.S the reason it is preformatted is because many AG documents have button
  13. #     layouts which depend on this. Perhaps later I will make it smarter, so that
  14. #     it can recognise obvious text paragraphs and do the right thing.
  15. # DONE: P.P.P.S handling some of the style flags, and the next, menu, prev, help, etc buttons
  16. #      is next, along with removing what can't be done (background colours etc).
  17.  
  18.  
  19. #Changes: October 16 1993 MJW
  20. #         Allow email addresses.
  21. #         Translate & to & > to > < to < 
  22.  
  23. if ( $#ARGV != 0 ) {
  24.   die "Usage: %0 <AmigaGuideFile> $!\n N.B. This program puts AG node HTML files in a dir.\n";
  25. }
  26.  
  27. $agname = $ARGV[0];
  28. $_ = $agname;
  29. if (/(.*)\.guide/){
  30.   $root = $1;
  31. } else {
  32.   die "Error: $agname doesn't seem to be an AmigaGuide(TM) file.\n";
  33. }
  34. $dirname = $root."_Sections";
  35.  
  36. if (! (-e $dirname)){
  37.   mkdir($dirname,oct(777));
  38. }
  39.  
  40. open (guidef, $agname)
  41.      || die "Can't open $agname: $!\n";
  42.      
  43. $databasefound=0;
  44.      
  45. while (<guidef>) {
  46.   chop;
  47.   if (    (m#@[dD][Aa][Tt][Aa][bB][aA][sS][eE]\s*"(.*)"#)
  48.        || (m#@[dD][Aa][Tt][Aa][bB][aA][sS][eE]\s*(\S*)#)){
  49.     if ($databasefound != 0) {
  50.       print "IGNORED: database label $1 found after first one $database\n";
  51.       next;
  52.     }
  53.     $databasefound = 1;
  54.     $database=$1;
  55.     print "Database: $database\n";
  56.     while (<guidef>){
  57.       chop;
  58.       $2="Untitled";
  59.       $buttonline = "<HR>";
  60.       if ( (m#@[Nn][oO][dD][Ee]\s*"(\S*)"\s*"(.*)"#)
  61.       || (m#@[Nn][oO][dD][Ee]\s*(\S*)\s*"(.*)"#)
  62.       || (m#@[Nn][oO][dD][Ee]\s*(\S*)#)
  63.       ){  
  64.           # found @Node LABEL "title"
  65.          # or just @node Label or even @node "label" "title"
  66.          $nodename = $1;
  67.          $nodetitle = $2;
  68.          $htmlname = $dirname."/".$1.".HTML";
  69.          if (-e $htmlname) {
  70.             unlink($htmlname);
  71.          }
  72.          open (pagef,'>'.$htmlname)
  73.          || die "Can't open $htmlname to write $!\n";
  74.          print pagef "<HTML>\n<TITLE>$nodetitle</TITLE>\n";
  75.          print pagef "<H1>$nodetitle</H1>\n<pre>\n";
  76.          last;
  77.       } else {
  78.           if (m#\S*#) {print "# SKIPPED while looking for @node: $_ \n"; }
  79.           next;
  80.       }
  81.     }   # Found first @node line
  82.     print "NOTE: main node is $htmlname\n";
  83.     # Now look for end of first node
  84.     while (<guidef>){
  85.       chop;
  86.       if (m#@[eE][nN][dD][Nn][oO][dD][Ee]#){
  87.         # found @endnode
  88.     #print "Found @endnode\n";
  89.     print pagef "</pre>\n";
  90.         if ($buttonline ne "<HR>") { print pagef "$buttonline"; }
  91.         print pagef "<HR>HTML Conversion by AG2HTML.pl & <a href=\"http://www.cs.cmu.edu:8001/Web/People/mjw/mjwhome.html\"><i>witbrock@cs.cmu.edu</i></a>\n";
  92.     close (pagef);
  93.     last;
  94.       } else {
  95.            # Remember TOC link, and delete the line if found
  96.            if (m#@[tT][oO][cC]\s*"?([^\"\s\}]*)"?#){
  97.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Contents]<\/a> ";
  98.               next;
  99.            }
  100.            # Remember prev link, and delete the line if found
  101.            if (m#@[pP][rR][eE][vV]\s*"?([^\"\s\}]*)"?#){
  102.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Browse <-]<\/a> ";
  103.               next;
  104.            }
  105.            # Remember next link, and delete the line if found
  106.            if (m#@[nN][eE][xX][tT]\s*"?([^\"\s\}]*)"?#){
  107.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Browse ->]<\/a> ";
  108.               next;
  109.            }
  110.            # Remember help link, and delete the line if found
  111.            if (m#@[hH][eE][lL][pP]\s*"?([^\"\s\}]*)"?#){
  112.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Help]<\/a> ";
  113.               next;
  114.            }
  115.            # otherwise look for links, or plain text
  116.        study;
  117.        s/&/&/g;
  118.        s/>/>/g;
  119.        s/</</g;       
  120.            s/@\{\s*\"([^\"]*)\"\s+link\s+\"*([^\"\s\}]*)\"*\s*\}/\<a href=\"$2\.HTML\"\>$1<\/a>/g;
  121.            s/@\{[bB]\}/<B>/g;  s/@\{[uU][bB]\}/<\/B>/g;  # bold
  122.            s/@\{[iI]\}/<I>/g;  s/@\{[uU][iI]\}/<\/I>/g;   #italic
  123.            if (m#@{#){   # Recognise and hide unhandled cases 
  124.               print "UNHANDLED?: $_\n";
  125.               s/(@\{[^\}]*\})/<!- Unhandled AmigaGuide(TM) sequence "$1">/g;
  126.            }
  127.        print pagef  "$_\n";
  128.       }
  129.     } # found end of first node, or of the file     
  130.   } else { # No database label on this line 
  131.     if ($databasefound == 0){  # stuff before first @database is ignored
  132.       print "#SKIPPED while looking for database: $_\n";
  133.       next;
  134.     }
  135.     # otherwise, it may be a perfectly good line
  136.     # check whether it is the start of a new node
  137.     $2="Untitled";
  138.     $buttonline = "<HR>";
  139.     if ( (m#@[Nn][oO][dD][Ee]\s*"(\S*)"\s*"(.*)"#)
  140.     || (m#@[Nn][oO][dD][Ee]\s*(\S*)\s*"(.*)"#)
  141.     || (m#@[Nn][oO][dD][Ee]\s*(\S*)#)
  142.     ){  # found @Node LABEL "title", @node Label, or even @node "label" "title"
  143.       $nodename = $1;
  144.       $nodetitle = $2;
  145.       $htmlname = $dirname."/".$1.".HTML";
  146.       if (-e $htmlname) {
  147.     unlink($htmlname);
  148.       }
  149.       open (pagef,'>'.$htmlname)
  150.        || die "Can't open $htmlname to write $!\n";
  151.       print pagef "<HTML>\n<TITLE>$nodetitle</TITLE>\n";
  152.       print pagef "<H1>$nodetitle</H1>\n<pre>\n";
  153.  
  154.        # print "Found Node: $nodename $nodetitle as $htmlname \n";
  155.        # since we found the beginning of the node, copy to the end
  156.        while (<guidef>){
  157.         chop;
  158.         if (m#@[eE][nN][dD][Nn][oO][dD][Ee]#){
  159.            # print "Found @endnode\n";            # found @endnode
  160.           print pagef "</pre>\n";
  161.         if ($buttonline ne "<HR>") { print pagef "$buttonline"; }
  162.             print pagef "<HR>HTML Conversion by AG2HTML.pl & <a href=\"http://www.cs.cmu.edu:8001/Web/People/mjw/mjwhome.html\"><i>witbrock@cs.cmu.edu</i></a>\n";
  163.        close (pagef);
  164.            last;
  165.         } else {
  166.            # Remember TOC link, and delete the line if found
  167.            if (m#@[tT][oO][cC]\s*"?([^\"\s\}]*)"?#){
  168.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Contents]<\/a> ";
  169.               next;
  170.            }
  171.            # Remember prev link, and delete the line if found
  172.            if (m#@[pP][rR][eE][vV]\s*"?([^\"\s\}]*)"?#){
  173.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Browse <-]<\/a> ";
  174.               next;
  175.            }
  176.            # Remember next link, and delete the line if found
  177.            if (m#@[nN][eE][xX][tT]\s*"?([^\"\s\}]*)"?#){
  178.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Browse ->]<\/a> ";
  179.               next;
  180.            }
  181.            # Remember help link, and delete the line if found
  182.            if (m#@[hH][eE][lL][pP]\s*"?([^\"\s\}]*)"?#){
  183.               $buttonline = $buttonline."<a href=\"$1\.HTML\">[Help]<\/a> ";
  184.               next;
  185.            }
  186.            # otherwise look for links, or plain text
  187.        study;
  188.        s/&/&/g;
  189.        s/>/>/g;
  190.        s/</</g;       
  191.        s/@\{\s*\"([^\"]*)\"\s+link\s+\"*([^\"\s\}]*)\"*\s*\}/\<a href=\"$2\.HTML\"\>$1<\/a>/g;
  192.            s/@\{[bB]\}/<B>/g;  s/@\{[uU][bB]\}/<\/B>/g;  # bold
  193.            s/@\{[iI]\}/<I>/g;  s/@\{[uU][iI]\}/<\/I>/g;   #italic
  194.            if (m#@{#){   # Recognise and hide unhandled cases 
  195.               print "UNHANDLED?: $_\n";
  196.               s/(@\{[^\}]*\})/<!- Unhandled AmigaGuide(TM) sequence "$1">/g;
  197.            }
  198.            print pagef  "$_\n";
  199.         }
  200.       }
  201.     } else {   # Haven't yet found a @node
  202.       if (m#\S*#) {print "# SKIPPED while looking for @node: $_ \n"; }
  203.       next;
  204.     }
  205.   }
  206. }
  207.  
  208.  
  209.  
  210. close guidef;
  211.  
  212.